#include <iostream>
#include <gtest/gtest.h>
#include <unordered_map>

// 自定义测试环境类1：基础环境配置
class MyEnvironment : public testing::Environment 
{
public:
    // 所有测试开始前执行（全局初始化）
    virtual void SetUp() override 
    {
        std::cout << "全局环境初始化 -> 所有测试开始前\n";
    }

    // 所有测试结束后执行（全局清理）
    virtual void TearDown() override 
    {
        std::cout << "全局环境清理 -> 所有测试结束后\n";
    }
};

// 测试用例组1：验证基础环境
TEST(MyEnvironment, test1) 
{
    std::cout << "执行测试用例1\n";
    EXPECT_TRUE(true);  // 始终成功的断言示例
}

TEST(MyEnvironment, test2) 
{
    std::cout << "执行测试用例2\n";
    EXPECT_EQ(2, 1+1);  // 验证加法运算
}

// 全局共享的测试数据（注意潜在的风险！）
std::unordered_map<std::string, std::string> mymap;

// 自定义测试环境类2：带数据初始化的环境
class MyMapTest : public testing::Environment 
{
public:
    // 所有测试开始前执行（会覆盖MyEnvironment的SetUp）
    virtual void SetUp() override 
    {
        std::cout << "\n[Map环境初始化] 准备测试数据\n";
        mymap.insert({"hello", "你好"});
        mymap.insert({"bye", "再见"});
    }

    // 所有测试结束后执行（会覆盖MyEnvironment的TearDown）
    virtual void TearDown() override 
    {
        std::cout << "[Map环境清理] 清空测试数据\n";
        mymap.clear();
    }
};

// 测试用例组2：验证字典操作（存在测试污染风险！）
TEST(MyMapTest, test1) 
{
    std::cout << "\n执行字典测试1 - 删除元素\n";
    ASSERT_EQ(mymap.size(), 2);  // 断言初始状态
    mymap.erase("hello");        // 修改共享数据
}

TEST(MyMapTest, test2) 
{
    std::cout << "\n执行字典测试2 - 检查元素\n";
    // 危险！test1的删除操作会影响这里的断言结果
    ASSERT_EQ(mymap.size(), 2);  // 实际会失败，因为test1修改了共享数据
}

int main(int argc, char *argv[]) 
{
    testing::InitGoogleTest(&argc, argv);
    
    // 注册全局环境对象（注意执行顺序问题）
    testing::AddGlobalTestEnvironment(new MyEnvironment);  // 先注册
    testing::AddGlobalTestEnvironment(new MyMapTest);      // 后注册但会覆盖前者
    

    return RUN_ALL_TESTS();

}
